/**
 * виджет поля ввода
 */

;(function($){

  $.widget("fs.changeText", {
    options: {url: "", fieldAttr: "", linkElement: ""},
  // конструктор
    _create: function()
             {
               var self = $.extend(this, {
                 _html      : "",
                 _value     : "",
                 _editing   : false,
                 linkElement: $(this.options.linkElement),
                 errElement : $("<div />", {"class": "wrapper errorMessage"}),
                 field      : $("<input />", {"type": "text", "class": "autosize"}).keydown(function(e)
                              {
                                switch (e.keyCode)
                                {
                                  case $.ui.keyCode.ENTER :
                                    $.post(self.options.url, {field: self.element.attr(self.options.fieldAttr), value: this.value}, function(response)
                                    {
                                      if (response.msg)
                                        self.errElement.html(response.msg).insertAfter(self.element);
                                      else
                                      {
                                        self.stop();
                                        if (!response.html)
                                        {
                                          response.html = ["(", ")"].join(self.linkElement.data("default") || "отсутствует");
                                          self.linkElement.addClass("disabled");
                                        }
                                        self.linkElement.html(self._html = response.html);
                                      }
                                    });
                                    break;
                                  case $.ui.keyCode.ESCAPE:
                                    self.stop();
                                    break;
                                  default:
                                    var input = this;
                                    setTimeout(function()
                                    {
                                      var value = input.value;
                                      if (value != self._value)
                                      {
                                        self._value = value;
                                        input.size  = Math.max(1, value.length);
                                        self.errElement.detach();
                                      }
                                    }, 100);
                                }
                              }).blur(function(){self.stop();}),
                 _onClick   : function(){self.start();return false;}
               });
               this.element.add(this.errElement).click(this._onClick);
             },
  // деструктор
    destroy: function()
             {
               this.stop();
               this.element.unbind("click", this._onClick);
               this.field.add(this.errElement).remove();
             },
  // начать редактирование
    start  : function()
             {
               if (!this._editing)
               {
                 this._editing = true;
                 this.element.addClass("hidden");
                 this._html = this.linkElement.html();
                 this.field.
                   val(this._value = this.linkElement.hasClass("disabled") ? "" : this.linkElement.text()).
                   appendTo(this.linkElement.empty()).
                   select().
                   focus()[0].size = Math.max(1, this._value.length);
               }
             },
  // закончить редактирование
    stop   : function()
             {
               if (this._editing)
               {
                 this.field.add(this.errElement).detach();
                 this.linkElement.html(this._html);
                 this.element.removeClass("hidden");
                 this._editing = false;
               }
             }
  });

})(jQuery);
